package main

import (
	"fmt"
	"strings"
)

type martian struct{}

func (m martian) talk() string {
	return "nack nack"
}

type laser int

func (l laser) talk() string {
	return strings.Repeat("pew ", int(l))
}
func (l laser) talk2() string {
	return strings.Repeat("pew ", int(l))
}

// 为了复用，通常会把接口声明为类型。
type talker interface {
	// 定义了一个方法
	talk() string
}

func shout(t talker) {
	louder := strings.ToUpper(t.talk())
	fmt.Println(louder)
}

// 为了复用，通常会把接口声明为类型。
// 按约定，接口名称通常以 er 结尾。
func main() {
	shout(martian{})
	shout(laser(2))

	type crater struct{}
	// crater does not implement talker (missing talk method)
	// shout(crater{})
}
